package TP5;

import TP5.VectorEstado.tipoGaseosa;
import java.util.ArrayList;

public class Expendedor {

    private int stockA;
    private int stockB;
    private int stockC;
    private int stockInicialA;
    private int stockInicialB;
    private int stockInicialC;
    private int capacidad;
    private ArrayList<Cliente> clientes;
    private EstadoServidor estado;

    public Expendedor(int stockInicialA, int stockInicialB, int stockInicialC, int capacidad) {
        if ((stockInicialA + stockInicialB + stockInicialC) > capacidad) {
            throw new IllegalArgumentException("La cantidad de latas cargadas no puede superar la capacidad.");
        }

        this.stockInicialA = stockInicialA;
        this.stockInicialB = stockInicialB;
        this.stockInicialC = stockInicialC;
        stockA = stockInicialA;
        stockB = stockInicialB;
        stockC = stockInicialC;
        this.capacidad = capacidad;
        estado = EstadoServidor.LIBRE;
        clientes = new ArrayList<Cliente>();
    }

    public int getStockA() {
        return stockA;
    }

    public Expendedor(Expendedor a) {
        this.stockA = a.stockA;
        this.stockB = a.stockB;
        this.stockC = a.stockC;
        this.stockInicialA = a.stockInicialA;
        this.stockInicialB = a.stockInicialB;
        this.stockInicialC = a.stockInicialC;
        this.capacidad = a.capacidad;
        this.clientes = (ArrayList<Cliente>) a.clientes.clone();
        this.estado = a.estado;
    }

    public int getStockB() {
        return stockB;
    }

    public int getStockC() {
        return stockC;
    }

    public int getStockInicialA() {
        return stockInicialA;
    }

    public int getStockInicialB() {
        return stockInicialB;
    }

    public int getStockInicialC() {
        return stockInicialC;
    }

    public int getCapacidad() {
        return capacidad;
    }

    public ArrayList<Cliente> getClientes() {
        return clientes;
    }

    public EstadoServidor getEstado() {
        return estado;
    }

    public void setEstado(EstadoServidor estadoServidor) {
        estado = estadoServidor;
    }

    void addCliente(Cliente nuevoCliente) {
        clientes.add(nuevoCliente);
    }

    public boolean consumirGaseosa(tipoGaseosa gaseosa) {

        switch (gaseosa) {
            case GaseosaA:
                if (stockA > 0) {
                    stockA--;
                } else {
                    return false;
                }
                break;
            case GaseosaB:
                if (stockB > 0) {
                    stockB--;
                } else {
                    return false;
                }
                break;
            case GaseosaC:
                if (stockC > 0) {
                    stockC--;
                } else {
                    return false;
                }
                break;
        }
        return true;
    }

    public void consumirCualquierGaseosa() {
        if (stockA > 0) {
            stockA--;
            return;
        }
        if (stockB > 0) {
            stockB--;
            return;
        }
        if (stockC > 0) {
            stockC--;
            return;
        }

    }

    public Cliente getClienteEnCola() {
        if (clientes.isEmpty()) {
            return null;
        }

        Cliente primero = clientes.get(0);
        for (Cliente cliente : clientes) {
            if (cliente.getHoraLlegada() < primero.getHoraLlegada()) {
                primero = cliente;
            }
        }

        return primero;
    }

    public void eliminarCliente() {

        for (int i = 0; i < clientes.size(); i++) {

            if (clientes.get(i).getEstado() == EstadoCliente.SIENDO_ATENDIDO) {
                clientes.remove(i);
            }

        }
    }

    public boolean hayGaseosa(tipoGaseosa gaseosa) {
        boolean resul = false;
        switch (gaseosa) {
            case GaseosaA:
                if (stockA > 0) {
                    resul = true;
                    break;
                }

            case GaseosaB:
                if (stockB > 0) {
                    resul = true;
                    break;
                }

            case GaseosaC:
                if (stockC > 0) {
                    resul = true;
                    break;
                }

        }
        return resul;
    }

    public boolean hayCualquierGaseosa() {
        if (stockA > 0) {
            return true;
        }
        if (stockB > 0) {
            return true;
        }
        if (stockC > 0) {
            return true;
        }
        return false;
    }

    double calcularTiempoReponer() {

        // CORREGIR
        return (10 + (capacidad - stockA - stockB - stockC) * 1 / 6);
    }

    /**
     * repone las gaseosas faltanes y cambia el stock inicial de alguna gaseosa si hace falta
     * @return Double Tiempo que tarda en reponer
     */
    public double reponer() {
        double tiempo = 10;
        int cantRetira = 0;

        if (!hayGaseosa(tipoGaseosa.GaseosaA)) {
           // stock B mayor a 50%
            if (stockB >= stockInicialB / 2) {
                 // stock C mayor a 50%
                if (stockC >= stockInicialC / 2) {
                    if (stockB >= stockC) {
                        stockInicialB = stockInicialB - 10;
                        stockInicialA = stockInicialA + 10;
                        if (stockB > stockInicialB) {
                            cantRetira += stockB - stockInicialB;
                            stockB = stockInicialB;
                        }
                    } else {
                        stockInicialC = stockInicialC - 10;
                        stockInicialA = stockInicialA + 10;
                        if (stockC > stockInicialC) {
                            cantRetira += stockC - stockInicialC;
                            stockC = stockInicialC;
                        }
                    }
                } else {
                    stockInicialB = stockInicialB - 10;
                    stockInicialA = stockInicialA + 10;
                    if (stockB > stockInicialB) {
                        cantRetira += stockB - stockInicialB;
                        stockB = stockInicialB;
                    }
                }
            } else {
                if (stockC >= stockInicialC / 2) {
                    stockInicialC = stockInicialC - 10;
                    stockInicialA = stockInicialA + 10;
                    if (stockC > stockInicialC) {
                        cantRetira += stockC - stockInicialC;
                        stockC = stockInicialC;
                    }
                }
            }

        }
        
        
        
        
        
        if (!hayGaseosa(tipoGaseosa.GaseosaB)) {
           // stock B mayor a 50%
            if (stockA >= stockInicialA / 2) {
                 // stock C mayor a 50%
                if (stockC >= stockInicialC / 2) {
                    if (stockA >= stockC) {
                        stockInicialA = stockInicialA - 10;
                        stockInicialB = stockInicialB + 10;
                        if (stockA > stockInicialA) {
                            cantRetira += stockA - stockInicialA;
                            stockA = stockInicialA;
                        }
                    } else {
                        stockInicialC = stockInicialC - 10;
                        stockInicialB = stockInicialB + 10;
                        if (stockC > stockInicialC) {
                            cantRetira += stockC - stockInicialC;
                            stockC = stockInicialC;
                        }
                    }
                } else {
                    stockInicialA = stockInicialA - 10;
                    stockInicialB = stockInicialB + 10;
                    if (stockA > stockInicialA) {
                        cantRetira += stockA - stockInicialA;
                        stockA = stockInicialA;
                    }
                }
            } else {
                if (stockC >= stockInicialC / 2) {
                    stockInicialC = stockInicialC - 10;
                    stockInicialB = stockInicialB + 10;
                    if (stockC > stockInicialC) {
                        cantRetira += stockC - stockInicialC;
                        stockC = stockInicialC;
                    }
                }
            }

        }
        
        
        // para gaseosa C
        
        if (!hayGaseosa(tipoGaseosa.GaseosaC)) {
           // stock B mayor a 50%
            if (stockB >= stockInicialB / 2) {
                 // stock C mayor a 50%
                if (stockA >= stockInicialA / 2) {
                    if (stockB >= stockA) {
                        stockInicialB = stockInicialB - 10;
                        stockInicialC = stockInicialC + 10;
                        if (stockB > stockInicialB) {
                            cantRetira += stockB - stockInicialB;
                            stockB = stockInicialB;
                        }
                    } else {
                        stockInicialA = stockInicialA - 10;
                        stockInicialC = stockInicialC + 10;
                        if (stockA > stockInicialA) {
                            cantRetira += stockA - stockInicialA;
                            stockA = stockInicialA;
                        }
                    }
                } else {
                    stockInicialB = stockInicialB - 10;
                    stockInicialC = stockInicialC + 10;
                    if (stockB > stockInicialB) {
                        cantRetira += stockB - stockInicialB;
                        stockB = stockInicialB;
                    }
                }
            } else {
                if (stockA >= stockInicialA / 2) {
                    stockInicialA = stockInicialA - 10;
                    stockInicialC = stockInicialC + 10;
                    if (stockA > stockInicialA) {
                        cantRetira += stockA - stockInicialA;
                        stockA = stockInicialA;
                    }
                }
            }

        }
// reponemos y contamos el tiempo que tarda;
        tiempo=10; // tiempo base
        tiempo=tiempo+ (stockInicialA-stockA)*1/6;
        tiempo=tiempo+ (stockInicialC-stockC)*1/6;
        tiempo=tiempo+ (stockInicialC-stockC)*1/6;
        stockA=stockInicialA;
        stockB=stockInicialB;
        stockC=stockInicialC;
      
        if(cantRetira>0) tiempo=tiempo+cantRetira*1/6+2;
        
        return tiempo;
    }
    
    
}
